package logica.product;

import java.util.ArrayList;

import logica.exceptions.DoesNotContainException;
import logica.exceptions.InvalidActionException;
import logica.exceptions.InvalidDataException;
import logica.exceptions.RequiredDataException;
import logica.interfaces.ProductIF;

/**
 * Um agrupamento de produtos de um sistema de leilao virtual.
 *
 *
 */
public class ProductGroup extends AbstractProduct {
	// lista que contem as chaves para o acesso aos produtos que compoem este
	private ArrayList<ProductIF> produtos;

	/**
	 * Construtor de um produto composto.
	 *
	 * @param owner
	 *            o login do dono do produto.
	 * @param name
	 *            nome do produto.
	 * @param description
	 *            descricao do produto.
	 * @param categoryId
	 *            identificador da categoria do produto.
	 * @param status
	 *            status do produto.
	 * @param quantity
	 *            quantidade de produtos.
	 * @param quantityInteress
	 *            quantidade minima de interessados.
	 * @param inicialPrice
	 *            preco inicial.
	 * @param type
	 *            identifica o tipo do produto (simples ou composto).
	 * @throws InvalidDataException
	 *             Se algum dado for invalido.
	 * @throws RequiredDataException
	 *             Se algum dado for nulo ou vazio.
	 */
	public ProductGroup(String id, String owner, String name,
			String description, String categoryId, String status, int quantity,
			int quantityInteress, double inicialPrice, String type)
			throws InvalidDataException, RequiredDataException {
		super(id, owner, name, description, categoryId, status, quantity,
				quantityInteress, inicialPrice, type);
		this.produtos = new ArrayList<ProductIF>();
	}

	/**
	 * Sobreposicao do metodo que adiciona outros produtos a este. Os ids dos
	 * produtos sao passados como referencia
	 *
	 * @param String
	 *            idItem
	 * @throws InvalidActionException
	 *             Neste caso, nao joga excessao.
	 * @throws InvalidDataException
	 *             Se o item for nulo ou vazio.
	 */
	@Override
	public void addItem(ProductIF idItem) throws InvalidActionException,
			InvalidDataException {
		if (idItem == null)
			throw new InvalidDataException("Product");

		this.produtos.add(idItem);

	}

	/**
	 * Sobreposicao do metodo que remove produtos que compoem este. Os ids dos
	 * produtos sao passados como referencia
	 *
	 * @param String
	 *            idItem
	 * @return boolean True se a operacao for bem sucedida.
	 * @throws DoesNotContainException
	 *             Se este agrupamento nao conter o produto da entrada.
	 * @throws InvalidDataException
	 *             o item for nulo.
	 */
	@Override
	public boolean removeItem(ProductIF idItem) throws DoesNotContainException,
			InvalidDataException {
		if (idItem == null)
			throw new InvalidDataException("Product");
		if (!this.produtos.contains(idItem))
			throw new DoesNotContainException("Product");
		return this.produtos.remove(idItem);
	}

}
